//package com.test.miniotest.minio.controller;
//
//import com.test.miniotest.minio.mapper.UploadDtoMapper;
//import com.test.miniotest.minio.utils.MinIOUtil;
//import com.test.miniotest.minio.utils.R;
//import com.test.miniotest.minio.utils.UploadDto;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.web.bind.annotation.PostMapping;
//import org.springframework.web.bind.annotation.RequestBody;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RestController;
//
//import java.time.LocalDateTime;
//import java.time.format.DateTimeFormatter;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Map;
//import java.util.concurrent.ConcurrentHashMap;
//
////@RequestMapping("/upload")
//@RestController
//public class BigFileController {
//
//    /**
//     * 假装这是一个数据库，用来存放已经上传过的数据信息
//     */
//    private ConcurrentHashMap<String, UploadDto> mysql = new ConcurrentHashMap<>();
//
//    /**
//     * 上传成功
//     */
//    private final Integer UPLOAD_SUCCESS = 0;
//
//    /**
//     * 部分上传
//     */
//    private final Integer UPLOAD_PART = 1;
//
//
//    @Autowired
//    private MinIOUtil minIOUtil;
//
//    /**
//     * 初始化大文件上传
//     * 未做优化，业务逻辑请根据实际情况修改
//     * @param uploadDto
//     * @return
//     */
//    @PostMapping("init-chunk-upload")
//    public R initChunkUpload(@RequestBody UploadDto uploadDto)throws Exception{
//        System.out.println("- - - "+uploadDto.toString());
//        //校验文件md5，该文件是否上传过
//        if(mysql.containsKey(uploadDto.getFileMd5())){
//            UploadDto mysqlFileData = mysql.get(uploadDto.getFileMd5());
//            //秒传
//            if(UPLOAD_SUCCESS.equals(mysqlFileData.getUploadStatus())){
//                return R.ok(UPLOAD_SUCCESS,mysqlFileData);
//            }
//            //续传
//            //获取到该文件已上传分片
//            Map<Integer,String> okChunkMap = minIOUtil.mapChunkObjectNames(uploadDto.getBucketName(),uploadDto.getFileMd5());
//            List<UploadDto> chunkUploadUrls = new ArrayList<>();
//            if (okChunkMap.size() > 0){
//                for (int i = 1; i <= uploadDto.getChunkCount(); i++) {
//                    //判断当前分片是否已经上传过了
//                    if(!okChunkMap.containsKey(i)){
//                        //生成分片上传url
//                        UploadDto url = new UploadDto();
//                        url.setPartNumber(i);
//                        url.setUploadUrl(minIOUtil.createUploadChunkUrl(uploadDto.getBucketName(),uploadDto.getFileMd5(),i));
//                        chunkUploadUrls.add(url);
//                    }
//                }
//                if (chunkUploadUrls.size() == 0){
//                    return R.ok("所有分片已经上传完成，仅需要合并文件");
//                }
//                return R.ok(mysqlFileData.getUploadStatus(),chunkUploadUrls);
//            }
//        }
//        //初次上传和已有文件信息但未上传任何分片的情况下则直接生成所有上传url
//        List<String> uploadUrls = minIOUtil.createUploadChunkUrlList(uploadDto.getBucketName(),uploadDto.getFileMd5(),uploadDto.getChunkCount());
//        List<UploadDto> chunkUploadUrls = new ArrayList<>();
//        for (int i = 1; i <= uploadUrls.size(); i++) {
//            UploadDto url = new UploadDto();
//            url.setPartNumber(i);
//            url.setUploadUrl(minIOUtil.createUploadChunkUrl(uploadDto.getBucketName(),uploadDto.getFileMd5(),i));
//            chunkUploadUrls.add(url);
//        }
//        //向数据库中记录该文件的上传信息
//        uploadDto.setUploadStatus(UPLOAD_PART);
//        mysql.put(uploadDto.getFileMd5(),uploadDto);
//
//        return R.ok(UPLOAD_PART,chunkUploadUrls);
//    }
//
//    /**
//     * 合并文件并返回文件信息
//     * @param uploadDto
//     * @return
//     */
//    @PostMapping("compose-file")
//    public R composeFile(@RequestBody UploadDto uploadDto)throws Exception{
//        //根据md5获取所有分片文件名称(minio的文件名称 = 文件path)
//        List<String> chunks = minIOUtil.listObjectNames(uploadDto.getBucketName(),uploadDto.getFileMd5());
//
//        //自定义文件名称
//        String fileName = uploadDto.getFileName();
//        String suffix = fileName.substring(fileName.lastIndexOf("."));
//        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
//        fileName = df.format(LocalDateTime.now()) + suffix;
//
//
//        uploadDto.setBucketName("bigfilecunchutest");
//        //合并文件
//        if(minIOUtil.composeObject(uploadDto.getBucketName(),chunks,fileName)){
//
//            //获取文件访问外链(1小时过期)
//            String url = minIOUtil.getObjectUrl(uploadDto.getBucketName(),fileName,60);
//            //获取数据库里记录的文件信息，修改数据并返回文件信息
//            UploadDto dbData = mysql.get(uploadDto.getFileMd5());
//
//            System.out.println("修改前------");
//            for (Map.Entry<String, UploadDto> entry : mysql.entrySet()) {
//                System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue().toString());
//            }
//
//            dbData.setUploadStatus(UPLOAD_SUCCESS);
//            dbData.setFileName(fileName);
//            dbData.setFilePath(url);
//            dbData.setSuffix(suffix);
//            mysql.put(uploadDto.getFileMd5(), dbData);
//
//
//            System.out.println("修改后------");
//            for (Map.Entry<String, UploadDto> entry : mysql.entrySet()) {
//                System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue().toString());
//            }
//
//            return R.ok(dbData);
//        }
//        return R.failed("合并文件失败");
//    }
//
//}
